home *** CD-ROM | disk | FTP | other *** search
/ The X-Philes (2nd Revision) / The X-Philes Number 1 (1995).iso / xphiles / hp48_2 / chasm01.sha / grammar.y < prev    next >
Text File  |  1995-03-23  |  5KB  |  348 lines

  1. /*
  2.  *    grammar.y - yacc parser
  3.  *
  4.  *    @(#)grammar.y    1.1 91/04/10
  5.  *
  6.  *    Copyright (c) 1991 Steve Scherf
  7.  *
  8.  *    Author:    Steve Scherf
  9.  *    Date:    Wed Apr 10 22:53:11 PDT 1991
  10.  *
  11.  */
  12.  
  13. %{
  14. #include <stdio.h>
  15.  
  16. extern char *vartab[];
  17. extern int bcnt;
  18. extern int svin;
  19. int lineno = 1;
  20. int pars_err;
  21.  
  22. %}
  23.  
  24. /* input token definitions */
  25.  
  26. %token  STRING
  27. %token  REG
  28. %token  VAR
  29. %token  CONST
  30. %token  LABEL
  31.  
  32. /* instruction token definitions */
  33. %token  ADD
  34. %token  AND
  35. %token  BCD
  36. %token  CLD
  37. %token  DATA
  38. %token  DEF
  39. %token  DMP
  40. %token  DSP
  41. %token  INK
  42. %token  JMP
  43. %token  JOF
  44. %token  JSR
  45. %token  MEM
  46. %token  MOV
  47. %token  OR
  48. %token  RES
  49. %token  RET
  50. %token  RND
  51. %token  SAR
  52. %token  SEQ
  53. %token  SHL
  54. %token  SHR
  55. %token  SIP
  56. %token  SNE
  57. %token  SNP
  58. %token  SSC
  59. %token  SUB
  60. %token  XOR
  61.  
  62.  
  63. %%    /* rules section */
  64.  
  65. line    : /* empty */
  66.     | line inst '\n'
  67.         {
  68.             lineno++;
  69.         }
  70.  
  71.     | line error '\n'
  72.         {
  73.             lineno++;
  74.             yyerrok;
  75.         }
  76.     ;
  77.  
  78. inst    : /* empty */
  79.     | ADD const ',' REG
  80.         {
  81.             add_inst(lineno, 0x7, $4, 1, 0x0, 0, $2, 2);
  82.         }
  83.  
  84.     | ADD REG ',' REG
  85.         {
  86.             add_inst(lineno, 0x8, $4, 1, $2, 1, 0x4, 1);
  87.         }
  88.  
  89.     | ADD REG ',' VAR
  90.         {
  91.             if($4 == 2)
  92.                 add_inst(lineno, 0xF, $2, 1, 0x0, 0, 0x1E, 2);
  93.             else
  94.                 yyerror("illegal variable usage");
  95.         }
  96.  
  97.     | AND REG ',' REG
  98.         {
  99.             add_inst(lineno, 0xF, $2, 1, $4, 1, 0x2, 1);
  100.         }
  101.  
  102.     | BCD REG
  103.         {
  104.             add_inst(lineno, 0xF, $2, 1, 0x0, 0, 0x33, 2);
  105.         }
  106.  
  107.     | CLD
  108.         {
  109.             add_inst(lineno, 0x0, 0x0, 0, 0x0, 0, 0x0E0, 3);
  110.         }
  111.  
  112.     | DATA dlist
  113.         {
  114.             add_str_list();
  115.         }
  116.  
  117.     | DEF LABEL ',' const
  118.         {
  119.             register int i;
  120.  
  121.             i = add_lab($2);
  122.             lineno++;
  123.             add_val(i, $4);
  124.             lineno--;
  125.         }
  126.  
  127.     | DMP REG
  128.         {
  129.             add_inst(lineno, 0xF, $2, 1, 0x0, 0, 0x55, 2);
  130.         }
  131.  
  132.     | DSP const ',' REG ',' REG
  133.         {
  134.             add_inst(lineno, 0xD, $4, 1, $6, 1, $2, 1);
  135.         }
  136.  
  137.     | INK REG
  138.         {
  139.             add_inst(lineno, 0xF, $2, 1, 0x0, 0, 0x0A, 2);
  140.         }
  141.  
  142.     | JMP const
  143.         {
  144.             add_inst(lineno, 0x1, 0x0, 0, 0x0, 0, $2, 3);
  145.         }
  146.  
  147.     | JOF const
  148.         {
  149.             add_inst(lineno, 0xB, 0x0, 0, 0x0, 0, $2, 3);
  150.         }
  151.  
  152.     | JSR const
  153.         {
  154.             add_inst(lineno, 0x2, 0x0, 0, 0x0, 0, $2, 3);
  155.         }
  156.  
  157.     | MEM const
  158.         {
  159.             add_pad($2);
  160.         }
  161.  
  162.     | MOV const ',' REG
  163.         {
  164.             add_inst(lineno, 0x6, $4, 1, 0x0, 0, $2, 2);
  165.         }
  166.  
  167.     | MOV REG ',' REG
  168.         {
  169.             add_inst(lineno, 0x8, $4, 1, $2, 1, 0x0, 1);
  170.         }
  171.  
  172.     | MOV const ',' VAR
  173.         {
  174.             if($4 == 2)
  175.                 add_inst(lineno, 0xA, 0x0, 0, 0x0, 0, $2, 3);
  176.             else
  177.                 yyerror("illegal variable usage");
  178.         }
  179.  
  180.     | MOV REG ',' VAR
  181.         {
  182.             switch($4) {
  183.                 case 0:
  184.                 add_inst(lineno, 0xF, $2, 1, 0x0, 0, 0x15, 2);
  185.                 break;
  186.                 case 1:
  187.                 add_inst(lineno, 0xF, $2, 1, 0x0, 0, 0x18, 2);
  188.                 break;
  189.                 case 2:
  190.                 yyerror("illegal variable usage");
  191.                 break;
  192.             }
  193.         }
  194.  
  195.     | MOV VAR ',' REG
  196.         {
  197.             if($2 == 0)
  198.                 add_inst(lineno, 0xF, $4, 1, 0x0, 0, 0x07, 2);
  199.             else
  200.                 yyerror("illegal variable usage");
  201.         }
  202.  
  203.     | OR REG ',' REG
  204.         {
  205.             add_inst(lineno, 0x8, $4, 1, $2, 1, 0x1, 1);
  206.         }
  207.  
  208.     | RES REG
  209.         {
  210.             add_inst(lineno, 0xF, $2, 1, 0x0, 0, 0x65, 2);
  211.         }
  212.  
  213.     | RET
  214.         {
  215.             add_inst(lineno, 0x0, 0x0, 0, 0x0, 0, 0x0EE, 3);
  216.         }
  217.  
  218.     | RND const ',' REG
  219.         {
  220.             add_inst(lineno, 0xC, $4, 1, 0x0, 0, $2, 2);
  221.         }
  222.  
  223.     | SAR REG ',' REG
  224.         {
  225.             add_inst(lineno, 0x8, $4, 1, $2, 1, 0x7, 1);
  226.         }
  227.  
  228.     | SEQ REG ',' REG
  229.         {
  230.             add_inst(lineno, 0x5, $2, 1, $4, 1, 0x0, 1);
  231.         }
  232.  
  233.     | SEQ const ',' REG
  234.         {
  235.             add_inst(lineno, 0x3, $4, 1, 0x0, 0, $2, 2);
  236.         }
  237.  
  238.     | SHL REG
  239.         {
  240.             add_inst(lineno, 0x8, $2, 1, 0x0, 0, 0x0E, 2);
  241.         }
  242.  
  243.     | SHR REG
  244.         {
  245.             add_inst(lineno, 0x8, $2, 1, 0x0, 0, 0x06, 2);
  246.         }
  247.  
  248.     | SIP REG
  249.         {
  250.             add_inst(lineno, 0xE, $2, 1, 0x0, 0, 0x9E, 2);
  251.         }
  252.  
  253.     | SNE const ',' REG
  254.         {
  255.             add_inst(lineno, 0x4, $4, 1, 0x0, 0, $2, 2);
  256.         }
  257.  
  258.     | SNE REG ',' REG
  259.         {
  260.             add_inst(lineno, 0x9, $2, 1, $4, 1, 0x0, 1);
  261.         }
  262.  
  263.     | SNP REG
  264.         {
  265.             add_inst(lineno, 0xE, $2, 1, 0x0, 0, 0xA1, 2);
  266.         }
  267.  
  268.     | SSC REG
  269.         {
  270.             add_inst(lineno, 0xF, $2, 1, 0x0, 0, 0x29, 2);
  271.         }
  272.  
  273.     | SUB REG ',' REG
  274.         {
  275.             add_inst(lineno, 0x8, $4, 1, $2, 1, 0x5, 1);
  276.         }
  277.  
  278.     | XOR REG ',' REG
  279.         {
  280.             add_inst(lineno, 0x8, $4, 1, $2, 1, 0x3, 1);
  281.         }
  282.  
  283.     | LABEL ':'
  284.         {
  285.             if(svin != -1) {
  286.                 add_val(svin, 0);
  287.                 yyerror("duplicate label");
  288.             }
  289.             svin = add_lab($1);
  290.         }
  291.     ;
  292.  
  293. dlist    : dlent
  294.     | dlist ',' dlent
  295.     | dlist ',' newln dlent
  296.     ;
  297.  
  298. dlent    : const
  299.         {
  300.             add_con(lineno, $1);
  301.             $$ = $1;
  302.         }
  303.  
  304.     | STRING
  305.         {
  306.             add_str(lineno, (char *)$1);
  307.             $$ = $1;
  308.         }
  309.     ;
  310.  
  311. const    : CONST
  312.         {
  313.             if($1 > 0xFFF || $1 < 0) {
  314.                 yyerror("constant out of range");
  315.                 $$ = 0;
  316.             }
  317.             else
  318.                 $$ = $1;
  319.         }
  320.  
  321.     | LABEL
  322.         {
  323.             register int i;
  324.  
  325.             i = add_lab($1);
  326.             $$ = ((i + 1) << 12) + 0xFFF;
  327.         }
  328.  
  329. newln    : '\n'
  330.         {
  331.             lineno++;
  332.         }
  333.  
  334.     | newln '\n'
  335.         {
  336.             lineno++;
  337.         }
  338.     ;
  339.  
  340. %%    /* C code */
  341.  
  342. yyerror(s)
  343. char *s;
  344. {
  345.     printf("line %d: %s\n", lineno, s);
  346.     pars_err = 1;
  347. }
  348.